// main.js
const fileProcessor = require('./readyNtxt.js');

const directoryPath = './dataIn/待处理TXT'; // TXT输入目录路径

// const interactWithChatGPT = require('./chatAPI.js');
const moveFile = require('./removeFile.js');

const fs = require('fs');
// const path=require('path');

// var qusetionRes=require('./qusetionTxt.js');
const { qusetionRes } = require('../qusetionTxt.js');

// const myModule = require('./makeExcel');
const moment = require('moment'); // 如果你在Node.js环境中，需要这样引入moment.js
// console.log(currentDateTime);

const path = require('path'); //取执行目录

// 日志模块初始化
const generateLog = require('./logger.js'); //日志模块
const logFilePath = path.join(__dirname, './log/appRun.log'); // 日志文件路径
const message = 'This is  system log,下面是本次系统运行日志：'; // 要记录的日志消息
generateLog(logFilePath, message); //初始写入日志

const generateContent = require('./Gmini.js'); //导入Gmini模块



// 备份上次运行数据
const moveFiles = require('./fileMover.js');
const sourceDir = './outExe/GminiResData'; // 替换为你的源目录路径
const targetDir = './outExe/lastRunDataBackup'; // 替换为你的目标目录路径
moveFiles(sourceDir, targetDir)
    .then(() => {
        console.log('所有文件成功移动到目标目录');
    })
    .catch(err => {
        console.error('发生错误:', err);
    });

var filterString = require('./filterString.js');

const {
    // writeToExcel,
    createExcelFile,
    // appendDataToExcel,
    appendToExcel, //导入表格模块
    // checkFileExists,
} = require('../outFile.js');




// 三个主表数据
var resData = [];
var resError = [];
var resOther = [];

// 延时，防止接口被封
function delay(ms) {
    console.log("延时", ms, "毫秒")
    return new Promise(resolve => setTimeout(resolve, ms));
}


var readyTxtName = "";
const destDir = 'outExe/GminiResData/';
let currentDateTime = moment().format('MM-DD HH-mm-ss'); // 取一个日期和时间作为移出TXT目录名称
// 创建一个新目录
const errTxtPath = path.join(destDir, '移出的TXT-' + currentDateTime);
// console.log("errTxtPath:", errTxtPath)
fs.mkdir(errTxtPath, { recursive: true }, (err) => {
    if (err) {
        return console.error(`Failed to create directory: ${err.message}`);
    }
    console.log('Directory created successfully!');
});
// 处理文件内容，等待异步操作完成，三个表数据的缓存
var arrryStr = [],
    arrryStr2 = [],
    arrryStr3 = []; //缓存处理结果的数组变量
async function processTxtFiles(counts) { //异步读取txt
    const version = '2.0'; // 添加版本信息
    if(version === '1.0') {
        // 保留1.0版本的兼容处理
        return await processTxtFilesV1(counts);
    }
    var counts = 1;

    try {
        let filePaths, filePath;
        do {
            // 获取一个新的、未读取的txt文件路径
            filePath = await fileProcessor.getNewTxtFilePath(directoryPath); //返回单个或全部路径
            // filePath = filePaths[0]
            // if(filePath !=""&& filePath !=null) { //文件队列是否已完成处理
            console.log("filePath:", filePath)
            if (filePath !== "" && filePath !== null) { //排除文件是否不存在或为空
                // 读取文件内容
                const qusetion = await qusetionRes();
                const content = await fileProcessor.readFileContent(filePath, counts); //异步读取
                var chatApiInputText = '"' + content.data + '"' + qusetion; //inputText
                // var sss=await qusetion
                var resultStr = "";
    // 添加版本日志记录
    generateLog(logFilePath, '当前运行版本：' + version);
                // console.log("chatApiInputText", chatApiInputText)
                try {
                    // 验证请求参数
                    if (!chatApiInputText || typeof chatApiInputText !== 'string') {
                        throw new Error('Invalid request parameters');
                    }
                    // 验证请求参数
                    if (!chatApiInputText || typeof chatApiInputText !== 'string') {
                        throw new Error('Invalid request parameters');
                    }
                    // 调用API并处理响应
                    const result = await generateContent(chatApiInputText); //调用gminiApi分析并等待结果返回
                    resultStr = JSON.stringify(result)
                    // 记录API请求日志
                    generateLog(logFilePath, 'API请求成功: ' + resultStr);
                    // 处理API响应错误
                    if (!result || result.reqStatus === 'error') {
                        throw new Error('API response error: ' + (result?.errorMessage || 'Unknown error'));
                    }


                    // console.log('Generated Content:', result)
                    if (result != "" && result != null && result.reqStatus != "error" && result.reqStatus != "ErrorResponse" && result.reqStatus != "ErrorRequest" && result.reqStatus != "ErrorMessage" && result.apiError !== "接口请求未成功！请检查地址或网络!" && result.parts.length > 0) {
                        var JsonStr = JSON.stringify(result.parts[0].text);
                        var texTStr = result.parts[0].text;
                        var STR = filterString.filter(texTStr);
                        console.log("分析结果:", STR, ",返回TXT:", JsonStr)
                        console.log("API返回:", resultStr);

                        if (result.parts.length > 0) {
                            if (result.parts[0].text !== "" && result.parts[0].text !== null && result.parts[0].text !== undefined) {

                                if (STR == "Y111") {
                                    arrryStr.push(content.email); //txt文件名，也就是邮箱名
                                    arrryStr.push("GminiChatV1.5"); //记录使用的模型
                                    arrryStr.push(STR); //追加分析结果1或0
                                    let currentDateTime = moment().format('MM-DD HH:mm:ss'); // 你可以根据需要自定义日期和时间的格式
                                    arrryStr.push(currentDateTime) //追加实时时间
                                        // console.log("完成第", counts, "个文本数据处理,模型是:", "GminiChatV1.5");
                                        // 正常处理后打印列表
                                    resData.push(arrryStr)

                                    console.log("arrryStr:", arrryStr)
                                    arrryStr = [];
                                } else if (STR == "N000") {
                                    arrryStr2.push(content.email); //txt文件名，也就是邮箱名
                                    arrryStr2.push("GminiChatV1.5"); //记录使用的模型
                                    arrryStr2.push(STR); //追加分析结果1或0
                                    let currentDateTime = moment().format('MM-DD HH:mm:ss'); // 你可以根据需要自定义日期和时间的格式
                                    arrryStr2.push(currentDateTime) //追加实时时间
                                    resError.push(arrryStr2)
                                        // 正常处理后打印列表

                                    console.log("arrryStr2:", arrryStr2)
                                    arrryStr2 = [];
                                } else {
                                    // readyTxtName = filePath;
                                    arrryStr3.push(content.email); //txt文件名，也就是邮箱名
                                    arrryStr3.push("GminiChatV1.5"); //记录使用的模型
                                    arrryStr3.push("NOT! 0 OR 1 ," + resultStr); // 返回了非1或0 的结果
                                    let currentDateTime = moment().format('MM-DD HH:mm:ss'); // 你可以根据需要自定义日期和时间的格式
                                    arrryStr3.push(currentDateTime) //追加实时时间
                                    moveFile(filePath, errTxtPath, (err, message) => {
                                        if (err) {
                                            console.error('Error moving file:', err);
                                        } else {
                                            console.log("失败的txt挪出完成!", message);
                                        }
                                    });
                                    resOther.push(arrryStr3)

                                    // 正常处理后打印列表
                                    console.log("arrryStr3-1:", arrryStr3)
                                    arrryStr3 = [];
                                }
                            } else {
                                readyTxtName = filePath;
                                console.log("第", counts, "个,", result.parts.length)
                                    // arrryStr.push("返回数据异常"+JSON.stringify(result.reqStatus))
                                arrryStr3.push(content.email); //txt文件名，也就是邮箱名
                                arrryStr3.push("GminiChatV1.5"); //记录使用的模型
                                arrryStr3.push("返回数据异常," + resultStr); //API返回异常
                                generateLog(logFilePath, 'API返回数据异常:' + content.email) //+ `${error}` + `--${nowTime}`);\
                                let currentDateTime = moment().format('MM-DD HH:mm:ss'); // 你可以根据需要自定义日期和时间的格式
                                arrryStr3.push(currentDateTime) //追加实时时间
                                moveFile(filePath, errTxtPath, (err, message) => {
                                    if (err) {
                                        console.error('Error moving file:', err);
                                    } else {
                                        console.log("失败的txt挪出完成！", message);
                                    }
                                });
                                resOther.push(arrryStr3)
                                    // 正常处理后打印列表

                                console.log("arrryStr3-2:", arrryStr3)
                                arrryStr3 = [];
                            }

                        } else {
                            readyTxtName = filePath;
                            // arrryStr.push("返回数据为空，" + JSON.stringify(result.reqStatus))
                            arrryStr3.push(content.email); //txt文件名，也就是邮箱名
                            arrryStr3.push("GminiChatV1.5"); //记录使用的模型
                            arrryStr3.push("返回数据格式不匹配,"); //API返回异常
                            console.log("第", counts, "个文本数据chatAPI返回异常:", arrryStr);
                            generateLog(logFilePath, "第" + counts + "个文件分析") //+ `${error}` + `--${nowTime}`);
                            let currentDateTime = moment().format('MM-DD HH:mm:ss'); // 你可以根据需要自定义日期和时间的格式
                            arrryStr3.push(currentDateTime) //追加实时时间
                            moveFile(filePath, errTxtPath, (err, message) => {
                                if (err) {
                                    console.error('Error moving file:', err);
                                } else {
                                    console.log("失败的txt挪出完成！", message);
                                }
                            });
                            resOther.push(arrryStr3)
                                // 正常处理后打印列表

                            console.log("arrryStr3-3:", arrryStr3)
                            arrryStr3 = [];
                        }
                    } else {
                        readyTxtName = filePath;
                        // arrryStr.push("返回为空！" + (result.reqStatus))
                        arrryStr3.push(content.email); //txt文件名，也就是邮箱名
                        arrryStr3.push("GminiChatV1.5"); //记录使用的模型
                        arrryStr3.push("返回数据为空！,"); //API返回异常
                        let currentDateTime = moment().format('MM-DD HH:mm:ss'); // 你可以根据需要自定义日期和时间的格式
                        arrryStr3.push(currentDateTime) //追加实时时间
                        console.log("第", counts, "个文本分析异常,chatAPI返回无效格式或接口不存在!", JSON.stringify(result));
                        // console.log("apiResult:", JSON.stringify(result), arrryStr)
                        generateLog(logFilePath, "result为空:" + JSON.stringify(result)) //+ `${error}` + `--${nowTime}`);
                        moveFile(filePath, errTxtPath, (err, message) => {
                            if (err) {
                                console.error('Error moving file:', err);
                            } else {
                                console.log("失败的txt挪出完成！", message);
                            }
                        });
                        resOther.push(arrryStr3)

                        // 正常处理后打印列表
                        console.log("arrryStr3-4:", arrryStr3)
                        arrryStr3 = [];
                    }

                    // console.log("arrryStr2:", arrryStr2)
                    // console.log("arrryStr3:", arrryStr3)

                } catch (error) {
                    readyTxtName = filePath;
                    // 记录详细的错误日志
                    generateLog(logFilePath, `API请求失败: ${error.message}\nStack: ${error.stack}`);
                    // 处理不同类型的错误
                    if (error instanceof TypeError) {
                        console.error('TypeError:', error);
                        throw new Error(`TypeError occurred: ${error.message}`);
                    } else if (error instanceof SyntaxError) {
                        console.error('SyntaxError:', error);
                        throw new Error(`SyntaxError occurred: ${error.message}`);
                    } else if (error instanceof Error) {
                        console.error('API Error:', error);
                        throw new Error(`API Error occurred: ${error.message}`);
                    } else {
                        console.error('Unknown Error:', error);
                        throw new Error(`Unknown Error occurred: ${error.message}`);
                    }
                    // console.error('ApiError:', error);
                    // arrryStr.push("接口异常！" + JSON.stringify(error))
                    console.log("第", counts, "个文本处理过程中出现异常，导致中断退出！", error);
                    arrryStr3.push(content.email); //txt文件名，也就是邮箱名
                    arrryStr3.push("GminiChatV1.5"); //记录使用的模型
                    arrryStr3.push("处理过程中出现异常错误导致循环中断！,"); //API返回异常
                    let currentDateTime = moment().format('MM-DD HH:mm:ss'); // 你可以根据需要自定义日期和时间的格式
                    arrryStr3.push(currentDateTime) //追加实时时间
                    generateLog(logFilePath, error) //+ `${error}` + `--${nowTime}`);
                    moveFile(filePath, errTxtPath, (err, message) => {
                        if (err) {
                            console.error('Error moving file:', err);
                        } else {
                            console.log("失败的txt挪出完成！", message);
                        }
                    });
                    resOther.push(arrryStr3)
                    console.log("arrryStr3-5:", arrryStr3)
                    arrryStr3 = [];
                } finally {
                    console.log("完成第", counts, "个TXT文件处理,模型是:", "GminiChatV1.5");
                    // 三张缓存表数据追加到主表
                    arrryStr = []
                    arrryStr2 = []
                    arrryStr3 = []
                    counts++;

                }


            } else {
                //   arrryStr.push(error)
                readyTxtName = filePath;
                console.log("TXT文件内容为空或已处理完！")
                generateLog(logFilePath, "文件处理完！共计:" + (counts - 1) + "个。") //+ `${error}` + `--${nowTime}`);
            }
            await delay(3000); //延迟5秒，避免API封杀！



        } while (filePath); // 当没有新的未读取文件时，filePath将为null/undefined，退出循环

        let currentDateTime = moment().format('MM-DD HH-mm-ss'); // 你可以根据需要自定义日期和时间的格式

        console.log("resData:", resData)
        console.log("resError:", resError)
        console.log("resOther:", resOther)
            // appendToExcel('./outExe/纯文本数据分析结果-GminiV1.5.xlsx', currentDateTime, resData); //写出失败记录 // 追加写出表格文件
        if (resData.length > 0) {
            createExcelFile(resData, './outExe/GminiResData/为1的-' + currentDateTime + '.xlsx', "sheet1")
        }
        if (resError.length > 0) {
            createExcelFile(resError, './outExe/GminiResData/为0的-' + currentDateTime + '.xlsx', "sheet1")
        }
        if (resOther.length > 0) {
            createExcelFile(resOther, './outExe/GminiResData/非1或0&Error-' + currentDateTime + '.xlsx', "sheet1")
        }
        generateLog(logFilePath, '完成全部' + (counts - 1) + '个文本数据处理！并保存了全部数据！') //+ `${error}` + `--${nowTime}`);


    } catch (error) {

        // 处理错误
        console.error('An error occurred:', error);
        generateLog(logFilePath, error) //+ `${error}` + `--${nowTime}`);
    }
}

// 开始处理txt文件
processTxtFiles();